package main

import (
	"fmt"
	"mylib"
)

/*
接口：视频，方法：制作、上映；
接口：黄暴产品，方法：刺激你的神经；
封装：封装电影类，属性：名字、公司、主演们，实现影视作品接口；
继承：爱情片、科幻片继承于电影，各自覆写制作方法；
接口继承：东方艺术，继承影视作品和黄暴产品；
多态：影视作品细分：电视剧、网络剧；
类型断言：零点以前看随机电影，零点以后看东方艺术；
*/

/*接口：视频，方法：制作、上映；*/
type IVideo interface {
	GetName() string
	Make()
}

/*接口：黄暴产品，方法：刺激你的神经；*/
type IHbo interface {
	Stimulate()
}

type IFilm interface {
	IVideo
	OnShow()
}


/*封装：封装电影类，属性：名字、主演们，实现影视作品接口*/
type Film struct {
	Name  string
	Stars []string
}

func (f *Film) GetName() string {
	return f.Name
}
func (f *Film) Make() {
	fmt.Println("电影在制作")
}
func (f *Film) OnShow() {
	fmt.Println("电影在上映")
}

/*继承：爱情片、科幻片继承于电影，各自覆写制作方法*/
type LoveFilm struct {
	Film
}

func (f *LoveFilm) Make() {
	fmt.Println("爱情片在制作")
}

type ScienceFilm struct {
	Film
}

func (f *ScienceFilm) Make() {
	fmt.Println("科幻片在制作")
}

/*接口继承：东方艺术，继承影视作品和黄暴产品*/
type IJapaneseArt interface {
	IVideo
	IHbo
}

/*视频细分：电影、电视剧、网络剧*/
type TvPlay struct {
	Name  string
	Stars []string
}

func (f *TvPlay) Make() {
	fmt.Println("电视剧在制作")
}
func (f *TvPlay) OnShow() {
	fmt.Println("电视剧在上映")
}

type NetPlay struct {
	Name  string
	Stars []string
}

func (f *NetPlay) Make() {
	fmt.Println("网络剧在制作")
}
func (f *NetPlay) OnShow() {
	fmt.Println("网络剧在上映")
}

/*东方艺术实现类*/
type LoveActionFilm struct {
	LoveFilm
}

func (laf *LoveActionFilm) Stimulate() {
	fmt.Println("爱情动作片带来的超爽体验令你欲仙欲死")
}

/*生成片库*/
func GetVideos() []IVideo {
	videos := make([]IVideo, 0)
	videos = append(
		videos,
		&LoveFilm{Film{"泰坦尼克号", []string{"小李子", "一个已经被遗忘了中年妇女"}}})
	videos = append(
		videos,
		&ScienceFilm{Film{"星球大战", []string{"乔治·卢卡斯", "无名氏2"}}})

	var japaneseArt IJapaneseArt
	laf := &LoveActionFilm{LoveFilm{Film{"雨夜的撸码痴汉.avi", []string{"小李子", "一个已经被遗忘了中年妇女"}}}}
	japaneseArt = laf
	videos = append(videos, japaneseArt)

	return videos
}

/*鉴定视频是否东方艺术*/
func IsJapanesArt(video IVideo) bool {
	if _, ok := video.(IJapaneseArt); ok {
		//ja.Stimulate()
		return true
	} else {
		return false
	}
}

/*零点以前看随机电影，零点以后看东方艺术*/
func main021() {
	videos := GetVideos()

	hour := mylib.GetRandomInt(25)
	fmt.Printf("当前时间%d:00\n", hour)
	if hour > 4 && hour < 24 {
		//看电影(非东方艺术)
		for _, video := range videos {
			if !IsJapanesArt(video) {
				fmt.Println("看",video.GetName())
			}
		}
	} else {
		//看东方艺术
		for _, video := range videos {
			if IsJapanesArt(video) {
				fmt.Println("看", video.GetName())
			}
		}
	}

}

func main() {
	videos := make([]IVideo, 0)
	videos = append(
		videos,
		&LoveFilm{Film{"泰坦尼克号", []string{"小李子", "一个已经被遗忘了中年妇女"}}})
	videos = append(
		videos,
		&ScienceFilm{Film{"星球大战", []string{"乔治·卢卡斯", "无名氏2"}}})

	laf := &LoveActionFilm{LoveFilm{Film{"雨夜的撸码痴汉.avi", []string{"小李子", "一个已经被遗忘了中年妇女"}}}}
	videos = append(videos, laf)

	//父类接口实例
	var ifilm IFilm
	//【子类实例】可以给【父类接口实例】赋值
	ifilm = laf
	fmt.Println(ifilm)

	//父类结构体实例
	var film Film
	//【子类实例】不能给【父类结构体实例】赋值
	film = laf
	fmt.Println(film)

	//断言为结构体——创建时是什么就只能是什么
	for _,video := range videos{
		switch video.(type) {
		case *LoveFilm:
			fmt.Println("LoveFilm",video.GetName())
		case *ScienceFilm:
			fmt.Println("ScienceFilm",video.GetName())

		//case *LoveActionFilm:
		//	fmt.Println("LoveActionFilm",video.GetName())

		case IFilm:
			fmt.Println("其它电影",video.GetName())
		default:
			fmt.Println("不是电影",video.GetName())
		}
	}

}
